<?php

declare(strict_types=1);


namespace app\admin\library;

/**
 * 浮点格式化
 * 
 */
class FloatDataFormatter
{
    static private $config = [
        'digits' => 4,
        'fix_zero' => false  //是否补0
    ];
    // private $digits = 4;
    // /**
    //  * 进位算法 (round,ceil,floor)
    //  * @var string
    //  */
    // private $opterate = 'round';

    /**
     * 获取配置
     * 
     * @ignore 内部使用
     * @param string $type
     * @param array $exConfig
     * @return array
     */
    static private function getConfig($type, $exConfig = [])
    {
        static $config = null;
        if (empty($config)) {
            $config = config('site.float_data_formatter');
        }
        return array_merge(isset($config[$type]) ? $config[$type] : self::$config, $exConfig);
    }

    /**
     * 获取是否舍0配置
     *
     * @param array $config
     * @return boolean
     */
    static private function isFixZero($config)
    {
        return $config['fix_zero'];
    }

    /**
     * 获取浮点位数配置
     * @param array $config
     * @return int
     */
    static private function digits($config)
    {
        return $config['digits'];
    }

    /**
     * 单价格式
     *
     * @param string|float $value
     * @param array $config
     * @return string
     */
    static public function price($value, $config = [])
    {
        return self::handler($value, 'price', $config);
    }

    /**
     * 金额格式
     *
     * @param string|float $value
     * @param array $config
     * @return string
     */
    static public function amount($value, $config = [])
    {
        return self::handler($value, 'amount', $config);
    }

    /**
     * 长度单位格式
     *
     * @param string|float $value
     * @param array $config
     * @return string
     */
    static public function length($value, $config = [])
    {
        return self::handler($value, 'length', $config);
    }

    /**
     * 重量单位格式
     *
     * @param string|float $value
     * @param array $config
     * @return string
     */
    static public function weight($value, $config = [])
    {
        return self::handler($value, 'weight', $config);
    }

    /**
     * 比率
     *
     * @param string|float $value
     * @param array $config
     * @return string
     */
    static public function ratio($value, $config = [])
    {
        return self::handler($value, 'ratio', $config);
    }

    /**
     * 数量类型
     *
     * @param string|float $value
     * @param array $config
     * @return string
     */
    static public function quantity($value, $config = [])
    {
        return self::handler($value, 'quantity', $config);
    }

    /**
     * 
     * @ignore 内部使用
     * @param string|float $value
     * @param string $type
     * @return string
     */
    static private function handler($value, $type, $config = [])
    {
        $config = self::getConfig($type, $config);
        $digits = self::digits($config) + 1;
        $formatter = "%.{$digits}f";
        $result = substr(sprintf($formatter, $value), 0, -1);
        return self::isFixZero($config) ? $result : strval(floatval($result));
    }
}
